module signal_top(

	input		wire					sys_clk,			//系统时钟
	input		wire					sys_ret_n,		//模块复位
	input		wire					key_select,		//按键输入
	input		wire					clk_a,			//ADC模块差分输入+
	input		wire					clk_b,			//ADC模块差分输入-
	input		wire	[7:0]			data_a,			//ADC模块差分数据+
	input		wire	[7:0]			data_b,			//ADC模块差分数据-
	
	output	wire						pnd,			//ADC模块掉电处理
	output	wire						adc_clk,		//ADC模块工作时钟
	
	input								test_clk,		//检测的频率输入
	output	wire						txd,			//串口信号输出
	input								rs232_rx		//串口输入
	
);

	//生成新的复位信号
	wire		ret_n;
	wire		locked;
	assign	ret_n = sys_ret_n & locked;
	
	
	/*--- 信号引出 ---*/
	wire				clk_50m;
	wire				clk_100m;
	wire				clk_20m;
	wire clk_200m;
	wire				clk_250m;
	
	wire	[29:0]		frequency_number;
	wire				rx_done;
	wire	[7:0] 			oder_data;
	wire				frequency_tx_done;
	wire				send_singal_en	;
	wire				send_frequency_en;
	wire				delay_sample_en	;
	wire 				frequency_tx;
	wire				 wrdata_clk;
	wire	[7:0]		wrdata;
	
	wire				key_out;
	wire				adc_out;
	wire				empty;
	wire	        	full; 
	wire				rd_en;
	wire				wr_en;
	wire				txd_done;
	wire	[7:0]		send_data;
	wire	[7:0]		data_sine;		
	
	/* ---->		调用PLL_IP产生25M和50M时钟		<----	*/	
	pll	pll_inst 
	(
			.areset 	(~sys_ret_n	),		//复位信号
			.inclk0 	(sys_clk 	),		//输入时钟
			.c0 		(clk_50m 	),		//50M输出时钟
			.c1 		(clk_100m 	),		//100M输出时钟
			.c2			(clk_20m	),		//20M输出时钟
			.locked 	(locked 	)		//锁定信号
	);
	
	/* ---->		调用PLL_IP产生200M时钟		<----	*/
	pll_200m pll_200m_1(
		.areset	(~sys_ret_n),
		.inclk0	(sys_clk),
		.c0		(clk_200m),
		.locked	()
	);
	
	/* ---->		调用按键消抖模块		<---- */
	key_dithering 	key_dithering_select
	(
			.clk		(clk_50m	),		//50M时钟
			.ret_n		(ret_n		),		//模块复位信号
			.key_in		(key_select	),		//按键输入
			
			.key_stable	(key_out	)		//消抖后的稳定信号
	);
	
	/* ---->		频率计检测模块		<---- */
	frequency_test frequency_test_1(
		.	clk					(clk_50m),				//50M系统时钟信号
		.	ret_n				(ret_n),				//复位信号
		.	test_clk			(test_clk),				//被检测频率的时钟信号
		.	standard_clk		(clk_200m),				//标准测量时钟
								
		.	frequency_number	(frequency_number)		//检测到的频率数据输出
	
	);
	
	/* ---->		串口数据接收模块		<---- */
	serial_port_input serial_port_input_1(
		.	clk			(clk_50m),
		.	rst_n		(ret_n),
		.	rs232_rx	(rs232_rx),
		.	band_set	(3'd4),
						
		.	data_byte	(oder_data),
		.	rx_done		(rx_done)
	
	);
	
	/* ---->		控制数据输出的总裁模块		<---- */
	data_select data_select_1(
		.	clk					(clk_50m),	
		.	rst_n				(ret_n),	
								
		.	rx_done				(rx_done),
		.	oder_data			(oder_data),
		.	auto_user_en		(),						//外部用户控制采样率的使能
		.	frequency_user_en	(),						//外部用户控制串口发送频率数据的使能
		.	frequency_tx_done	(frequency_tx_done),	//频率数据发送结束的信号
										
		.	send_singal_en		(send_singal_en),		//发送波形数据的串口的使能
		.	send_frequency_en	(send_frequency_en),	//发送频率数据的串口的使能
		.	delay_sample_en		(delay_sample_en) 		//控制delay_sample的采样率的使能
	
	);
	
	/* ---->		频率数据串口输出模块		<---- */
	serial_port_many_output serial_port_frequency(
		.	clk					(clk_50m),
		.	rst_n				(ret_n),
		.	serial_port_en		(send_frequency_en),//send_frequency_en
		.	baud_set			(3'd4),
		.	user_read_data		({8'h85,{2'd0,frequency_number}}),
								
		.	rs232_tx			(frequency_tx),
		.	tx_data_suecess		(frequency_tx_done),	//一组多字节发送结束
		.	tx_done				(),						//一个字节发送结束
		.	uart_state			()
	);

	/* ---->		自动采样模块		<---- */
	delay_sampel delay_sampel_1(
		.	clk_250m		(clk_200m),/*******clk_100m********/
		.	rst_n			(ret_n),
							
		.	ad_data			(data_sine),				//数据输入
		.	en_sample		(delay_sample_en),			//模块使能
		.	test_frequency	({2'd0,frequency_number}),	//频率数据{2'd0,frequency_number}
							
		.	wrdata_clk		(wrdata_clk),				//写数据FIFO的时钟
		.	wrdata			(wrdata)					//写入FIFO的数据
	
	);

	/* ---->		ADC数据处理模块		<----	*/
	ad9481	ad9481_inst
	(	
			.clk		(clk_200m	),		//采样时钟 /*******clk_100m********/
			.ret_n		(ret_n		),		//复位信号
			.clk_a		(clk_a		),		//输入时钟A
			.clk_b		(clk_b		),		//输入时钟B
			.data_a		(data_a		),		//输入数据A
			.data_b		(data_b		),		//输入数据B
			
			.data_sine	(data_sine	),		//处理后输出数据	
			.pnd		(pnd		),		//ADC模块掉电操作，高电平掉电
			.adc_clk	(adc_clk	)		//ADC采样时钟  adc_clk == clk_20m
	);
	
	/* ---->		FIFO缓存模块		<---- */
	fifo	fifo_inst (
	
			.aclr 		( ~ret_n	   ),			//同步清零
		
			.rdclk 		( clk_50m 	),				//读时钟
			.rdreq 		( txd_done	),				//读使能
			.q 			( send_data ),				//读数据
			
			.wrclk 		( clk_200m 	),				//写时钟	/*******clk_100m********/
			.wrreq 		( wr_en	&& wrdata_clk ),	//写使能
			.data 		( wrdata ),					//写数据
			
			.rdempty 	( empty 	),				//读空信号
			.wrfull 	( full 		)				//写满信号
	
	);


	/* ---->		FIFO缓存控制模块		<---- */
	fifo_control	fifo_control_inst(

			.clk	(clk_50m	),
			.ret_n	(ret_n	),
			.empty	(empty	),
			.full	(full		),
			
			.rd_en	(rd_en	),
			.wr_en	(wr_en	)

	); 
	
	/* ---->		波形数据串口输出模块		<---- */
	uart_send	uart_send_inst(

			.clk				(clk_50m	),			//系统时钟信号
			.ret_n		 		(ret_n		),			//复位信号
			.bit_select			(3'd5		),			//比特率选择信号
			.send_data			(send_data	),			//传输的数据
			.send_data_start	(rd_en		),			//数据传输，来一个高电平传输一次
			
			.txd				(sigal_tx	),			//传输的数据串行信号
			.txd_done			(txd_done	)			//数据传输完成信号
	
	);

assign txd = (send_frequency_en)? frequency_tx : sigal_tx;	//串口输出数据选择


endmodule	 






























